package com.mkz.jbpm.activiti;

import java.util.List;
import java.util.Map;

import org.activiti.engine.ActivitiObjectNotFoundException;
import org.activiti.engine.task.Comment;

import io.swagger.annotations.ApiOperation;

/**
 * ClassName: ActTaskService 
 * @Description: 流程任务服务类
 * @author: KuangJianyu
 * @date: 2020年4月3日
 */
public interface ActTaskService {
	/**
	 * @Description: 为流程任务设置变量，如果变量尚未存在，则将在任务中创建该变量
	 * @param taskId
	 * @param variableName
	 * @param variableValue
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	@ApiOperation(value = "为流程任务设置变量", notes = "如果变量尚未存在，则将在任务中创建该变量")
	public void setVariableLocal(String taskId, String variableName, Object value);
	/**
	 * @Description: 为流程任务设置多对变量，如果变量尚未存在，则将在任务中创建该变量
	 * @param taskId
	 * @param variables
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public void setVariablesLocal(String taskId, Map<String, ? extends Object> variables);
	/**
	 * @Description: 任务签收
	 * @param taskId
	 * @param userId
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public void claim(String taskId, String userId) throws Exception;
	/**
	 * 
	 * @Description: 任务反签收
	 * @param taskId
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public void unclaim(String taskId) throws Exception;
	/**
	 * @Description: 执行任务
	 * @param taskId
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public void complete(String taskId) throws Exception;
	/**
	 * @Description: 执行任务，并设置任务变量
	 * @param taskId
	 * @param variables
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public void complete(String taskId, Map<String, Object> variables) throws Exception;
	/**
	 * @Description: 执行任务，并设置任务变量
	 * @param taskId
	 * @param variables
	 * @param localScope
	 * @return
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public Map<String, Object> complete(String taskId, Map<String, Object> variables, boolean localScope);
	/**
	 * @Description: 执行任务，并处理下个节点候选人
	 * @param taskId
	 * @param variables
	 * @param localScope
	 * @return
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	@ApiOperation(value = "完成任务", notes = "并处理下个节点候选人")
	public Boolean completeAndDealNext(String taskId, Map<String, Object> variables, String remark);
	/**
	 * @Description: 处理下个节点候选处理人
	 * @param taskId
	 * @author: KuangJianyu
	 * @date: 2020年4月4日
	 */
	public void dealNextNodeCandidates(String taskId);
	/**
	 * @Description: 任务移交：将任务的所有权转移给其他用户
	 * @param taskId
	 * @param userId
	 * @throws ActivitiObjectNotFoundException
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public void setAssignee(String taskId, String userId) throws ActivitiObjectNotFoundException;
	/**
	 * @Description: 任务委派
	 * @param taskId
	 * @param userId
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	void delegate(String taskId, String userId);
	/**
	 * @Description: 委派任务完成，归还委派人
	 * @param taskId
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	void resolveTask(String taskId);
	/**
	 * @Description: 更改任务拥有者
	 * @param taskId
	 * @param userId
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	void setOwner(String taskId, String userId);
	/**
	 * @Description: 删除任务
	 * @param taskId
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	void delete(String taskId);
	/**
	 * @Description: 删除任务，附带删除理由
	 * @param taskId
	 * @param reason
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	void deleteWithReason(String taskId, String reason);
	/**
	 * @Description: 为任务添加任务处理人
	 * @param taskId
	 * @param userId
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public void addCandidateUser(String taskId, String userId) throws Exception;
	/**
	 * @Description: 为流程任务 和/或 流程实例添加注释
	 * @param taskId
	 * @param processInstanceId
	 * @param message
	 * @return
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public Comment addComment(String taskId, String processInstanceId, String message) throws Exception;
	/**
	 * @Description: 为流程任务 和/或 流程实例添加注释
	 * @param taskId
	 * @param processInstanceId
	 * @param type
	 * @param message
	 * @return
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月5日
	 */
	public Comment addComment(String taskId, String processInstanceId, String type, String message) throws Exception;
	/**
	 * @Description: 查询与任务相关的注释信息
	 * @param taskId
	 * @return
	 * @throws Exception
	 * @author: KuangJianyu
	 * @date: 2020年4月3日
	 */
	public List<Comment> getTaskComments(String taskId) throws Exception;
}
